package persistencia;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import modelo.*;

public class LibroDAO {
	
	private ConfigDAO config;
	
	public LibroDAO() {
		ConfigDAO.setConnection();
		this.config = new ConfigDAO();
	}
	
	public void addLibro(Libro libro) {
		try {
			String query = "INSERT INTO libros (isbn, titulo, genero, precio) VALUES (?,?,?,?)";
			PreparedStatement ps = config.getConnection().prepareStatement(query);
			ps.setString(1, libro.getIsbn());
			ps.setString(2, libro.getTitulo());
			ps.setString(3, libro.getGenero());
			ps.setFloat(4, libro.getPrecio());
			ps.execute();
			
			if (libro.getAutores() != null)
				this.addAutores(libro);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}
	
	public void delLibro(Libro libro) {
		try {
			this.delAutores(libro);
			
			String query = "DELETE FROM libros WHERE isbn = ?";
			PreparedStatement ps = config.getConnection().prepareStatement(query);
			ps.setString(1, libro.getIsbn());
			ps.execute();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public Libro getLibro(Libro libro) {
		try {
			Libro l = new Libro();
			
			String query = "SELECT * FROM libros WHERE isbn = ?";
			PreparedStatement ps = config.getConnection().prepareStatement(query);
			ps.setString(1, libro.getIsbn());
			ResultSet rs = ps.executeQuery();
			if (rs.next()) {
				l.setIsbn(rs.getString(1));
				l.setTitulo(rs.getString(2));
				l.setGenero(rs.getString(3));
				l.setPrecio(rs.getFloat(4));
				
				Set<Autor> autores = new HashSet<Autor>();
				String queryAutores = "SELECT idautor FROM autorlibro WHERE isbn = ?";
				PreparedStatement psAutores = config.getConnection().prepareStatement(queryAutores);
				psAutores.setString(1, libro.getIsbn());
				ResultSet rsAutores = psAutores.executeQuery();
				while (rsAutores.next()) {
					Autor a = getAutor(rsAutores.getInt(1));
					if (a != null)
						autores.add(a);
				}
				l.setAutores(autores);
				
				return l;
				
			} else {
				return null;
			}
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
		
	}
	
	Autor getAutor(int idAutor) {
		try {
			String query = "SELECT * FROM autores WHERE idautor = ?";
			PreparedStatement ps = config.getConnection().prepareStatement(query);
			ps.setInt(1, idAutor);
			ResultSet rs = ps.executeQuery();
			if (rs.next()) {
				Autor a = new Autor();
				a.setIdAutor(rs.getInt(1));
				a.setNombre(rs.getString(2));
				a.setApellido(rs.getString(3));
				return a;
			} else {
				return null;
			}
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	public Set<Libro> getLibros() {
		try {
			Set<Libro> libros = new HashSet<Libro>();
			
			String query = "SELECT isbn FROM libros";
			PreparedStatement ps = config.getConnection().prepareStatement(query);
			ResultSet rs = ps.executeQuery();
			while (rs.next()) {
				Libro l = new Libro();
				l.setIsbn(rs.getString(1));
				Libro libro = this.getLibro(l);
				if (libro != null)
					libros.add(libro);
			}
			
			return libros;
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
		
	}
	
	public void addAutores(Libro libro) {
		try {
			Iterator<Autor> iterator = libro.getAutores().iterator();
			while (iterator.hasNext()) {
				Autor a = iterator.next();
				String query = "INSERT INTO autorlibro (isbn, idautor) VALUES (?,?)";
				PreparedStatement ps = config.getConnection().prepareStatement(query);
				ps.setString(1, libro.getIsbn());
				ps.setInt(2, a.getIdAutor());
				ps.execute();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public void delAutores(Libro libro) {
		try {
			String query = "DELETE FROM autorlibro WHERE isbn = ?";
			PreparedStatement ps = config.getConnection().prepareStatement(query);
			ps.setString(1, libro.getIsbn());
			ps.execute();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
}
